<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <script>
        // str.search(pattern|RegExp) 在字符串中查找某个子串，如果存在返回 下标，找不到返回 -1
        var str = 'hello wrold';
        console.log(str.search('llo'));
        console.log(str.search(/llo/));
        console.log(str.search('s'));

        /*
        RegExp.test(str)  查看字符串汇总是否有符合正则匹配的内容，如果有，返回true，没有返回false，效果类似于  str.search(RegExp) !== -1
        */
        console.log(/llo/.test(str));
        console.log(str.search(/llo/) !== -1);

        /*
        str.match(RegExp)  查找字符串中符合正则表达式的内容，查找的结果组成一个数组返回，如果没有符合条件的内容，就返回null。
            如果正则表达式含有g属性，那么返回的数组是没有额外属性（匹配到内容的下标）
        */
        console.log(str.match(/n/));
        console.log(str.match(/l/));
        console.log(str.match(/l/g));

        /*
        RegExp.exec(str) 检索字符串中指定的值。返回找到的值，并确定其位置
        RegExp.lastIndex 返回或者指定正则匹配的起始位置
            如果正则表达式没有g属性，那么exec返回的结果与match的结果一致
            如果有g属性，那么exec返回的结果为每一次从reg.lastIndex开始匹配到的内容，返回类似于match出来的结果，如果结果为null，再次匹配从头开始
        */

        var reg = /d/g;
        console.log('正则 reg 匹配进行的起始位置为：', reg.lastIndex);
        console.log(reg.exec(str));
        console.log('正则 reg 匹配进行的起始位置为：', reg.lastIndex);
        console.log(reg.exec(str));
        console.log('正则 reg 匹配进行的起始位置为：', reg.lastIndex);
        console.log(reg.exec(str));
        console.log('正则 reg 匹配进行的起始位置为：', reg.lastIndex);
        console.log(reg.exec(str));
        reg.lastIndex = 7; // 设置正则开始匹配的下标
        console.log('正则 reg 匹配进行的起始位置为：', reg.lastIndex);
        console.log(reg.exec(str));


        /*
        y 修饰符，表示从 reg.lastIndex 开始进行的匹配，一般用于精确查找：例如在1000个字符组成的串中查找某个子串
        */
        console.log('y修饰符，当前reg.lastIndex 为0', str.match(/l/y));
        var reg1 = /l/y;
        reg1.lastIndex = 1;
        console.log('y修饰符，当前reg.lastIndex 为2', str.match(reg1));
        console.log(reg1.lastIndex); // 匹配成功，lastIndex加一
        console.log('y修饰符，当前reg.lastIndex 为3', reg1.exec(str));

        /*
        str.split(pattern|RegExp, limit)  将字符串分割成数组，并指定长度
        */
        var str1 = '2019-12-26';
        var str2 = 'ad1cd3hgh9sadf7sdc5cd2s';
        console.log(str1.split('-'));
        console.log(str1.split(/-/));
        console.log(str2.split(/\d/, 2));

        /*
        str.replace(str|RegExp, str|function)
            替换的str里面可以使用特殊符号： $$ $& $` $' $n
            替换内容写成函数，函数的形参有： mtr(符合条件的子串) p1...pn 表示捕获组中的内容   index 匹配到内容的下标   s 匹配的源字符串   函数的返回值为要替换成的值
            *****五星
        */
        // 将 hello world 中的 l 替换成 m
        str = str.toUpperCase();
        console.log('替换', str.replace('l', 'm'));
        console.log('替换', str.replace(/l/ig, 'm'));

        console.log('替换', str.replace(/l/ig, '$$'));
        var str3 = "Jhon smith, Jhon rice, Jhon mooth";
        console.log('原来的写法', str3.replace('Jhon', 'Mr.Jhon'));
        console.log('$& 表匹配到的内容', str3.replace(/Jhon/g, 'Mr.$&'));

        console.log('$` 表匹配内容之前的东西', str.replace(/llo/i, '$`'));
        console.log("$' 表匹配内容之后的东西", str.replace(/llo/i, "$'"));
        console.log('$n 匹配到的组', str.replace(/(he)(llo)/i, '$2$1'));

        var n = 0;
        var returnStr = str2.replace(/(\d)/g, function (mtr, p1, index, s) {
            n++;
            console.log(`第${ n }次匹配到的内容: ${ mtr }`);
            console.log(`()中的内容为: ${ p1 }`);
            console.log("匹配到的下标为：", index);
            console.log("用于匹配的字符串为：", s);
            return "(NUMBER)";
        })
        console.log(returnStr);
    </script>
</body>
</html>